package main

import (
	"context"
	"fmt"

	// 起别名，反之和其它的包名称冲突
	corev1 "k8s.io/api/core/v1"                   // 核心包
	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" // 元数据包
	"k8s.io/client-go/kubernetes"
	"k8s.io/client-go/tools/clientcmd"
)

// 列出命名空间中所有pod
func ListPod(clientset *kubernetes.Clientset, namespace string) { // 客户端， 命名空间
	// 获取所有的pod
	pods, err := clientset.CoreV1().Pods(namespace).List(
		context.TODO(),       // 上下文对象
		metav1.ListOptions{}, // 列表中的配置
	)
	if err != nil {
		panic(err)
	}
	// 遍历
	for _, pod := range pods.Items {
		// 获取到每个pod名称和状态
		fmt.Println(pod.Name, pod.Status.Phase)
	}
}

// 获取指定的pod
func GetPod(clientset *kubernetes.Clientset, namespace string, podName string) {
	pod, err := clientset.CoreV1().Pods(namespace).Get(
		context.TODO(),
		podName, // pod名称
		metav1.GetOptions{},
	)
	if err != nil {
		panic(err)
	}
	fmt.Println(pod.Name, pod.Status.Phase)
}

// 创建pod
func CreatePod(clientset *kubernetes.Clientset, namespace string) {
	pod := &corev1.Pod{
		ObjectMeta: metav1.ObjectMeta{ // 元数据
			Name:   "nsd-nginx",
			Labels: map[string]string{"app": "nsd2409"},
		},
		Spec: corev1.PodSpec{ // pod规格
			Containers: []corev1.Container{
				{
					Name:  "nginx-container", // 容器名称
					Image: "nginx:latest",    // 镜像版本
					Ports: []corev1.ContainerPort{ // 容器端口
						{
							ContainerPort: 80,
						},
					},
				},
			},
		},
	}
	// 创建
	result, err := clientset.CoreV1().Pods(namespace).Create(
		context.TODO(),
		pod, // 先前设置好的pod
		metav1.CreateOptions{},
	)
	if err != nil {
		panic(err)
	}
	fmt.Println("pod创建成功：", result.GetObjectMeta().GetName(), result.GetObjectMeta().GetLabels())
}

func UpdatePod(clientset *kubernetes.Clientset, namespace string, podName string) {
	// 获取指定的Pod
	pod, err := clientset.CoreV1().Pods(namespace).Get(
		context.TODO(), // 用于控制超时或者取消
		podName,
		metav1.GetOptions{},
	)
	if err != nil {
		panic(err)
	}
	// 修改镜像信息
	pod.Spec.Containers[0].Image = "nginx:1.26"
	// 执行更新
	updatePod, err := clientset.CoreV1().Pods(namespace).Update(
		context.TODO(),
		pod,
		metav1.UpdateOptions{},
	)
	if err != nil {
		panic(err)
	}
	fmt.Println("更新后的pod：", updatePod.Spec.Containers[0].Image)
}

// 删除pod
func DeletePod(clientcmd *kubernetes.Clientset, namespace, podName string) {
	// 定义删除测试，先停止所有的容器停止后，再删除；
	deletePolicy := metav1.DeletePropagationBackground
	// 先查找pod，再删除
	err := clientcmd.CoreV1().Pods(namespace).Delete(
		context.TODO(),
		podName,
		metav1.DeleteOptions{
			PropagationPolicy: &deletePolicy, // 指定删除策略
		},
	)
	if err != nil {
		panic(err)
	}
	fmt.Println("pod删除成功：", podName)
}

func main() {
	// 创建客户端配置
	config, err := clientcmd.BuildConfigFromFlags("", "../config/kubeconfig")
	if err != nil {
		panic(err)
	}
	// 创建客户端
	clientset, err := kubernetes.NewForConfig(config)
	if err != nil {
		panic(err)
	}
	// fmt.Println("客户端创建成功：", clientset)
	// 获取所有的pod
	ListPod(clientset, "default")
	// 获取指定的pod
	// GetPod(clientset, "default", "demo-pod")
	// 创建pod
	// CreatePod(clientset, "default")
	// 更新pod
	// UpdatePod(clientset, "default", "nsd-nginx")
	// 删除pod
	// DeletePod(clientset, "default", "nsd-nginx")
}
